Introduction

In this Rmarkdown document we are going to load the MAGIC-denoised data to better visualize genes and ease with the annotation when using specific marker genes. MAGIC was developed by Smita Krishnaswamy’s lab to try to fill in the drop out reads in the spots. MAGIC is a Markov Affinity-based Graph Imputation of Cells used for denoising high-dimensional data most commonly applied to single-cell RNA sequencing data. MAGIC learns the manifold data, using the resultant graph to smooth the features and restore the structure of the data based on their k-nearest neighbors.

Libraries

library(Seurat)
library(dplyr)
library(ggplot2)
library(SPATA2)
library(UCell)
library(stringr)

Parameters

set.seed(123)
source(here::here("misc/paths.R"))
source(here::here("utils/bin.R"))

"{plasma}/{plt_dir}" %>%
  glue::glue() %>%
  here::here() %>%
  dir.create(path = .,
             showWarnings = FALSE,
             recursive = TRUE)

"{plasma}/{robj_dir}" %>%
  glue::glue() %>%
  here::here() %>%
  dir.create(path = .,
             showWarnings = FALSE,
             recursive = TRUE)
scatterplot <- function(x, y, color) {
  df <- data.frame(
    feat1 = se_sub@assays$MAGIC_Spatial@data[x, ],
    feat2 = se_sub@assays$MAGIC_Spatial@data[y, ],
    color = se_sub@meta.data[, color]
  )
  
  ggplot2::ggplot(df,
                  ggplot2::aes(x = feat1,
                               y = feat2,
                               color = color)) +
    ggplot2::geom_point() +
    ggplot2::theme_classic() +
    ggplot2::labs(
      x = x,
      y = y,
      color = color)
}

Load data

The data used in this Rmarkdown document comes from 03-clustering_integration.Rmd where the data was integrated.

merged_se <- "{anot}/{robj_dir}/integrated_spatial_annot.rds" %>%
  glue::glue() %>%
  here::here() %>%
  readRDS(file = .)

Load MAGIC data from the script MAGIC_denoising-plasma.Rmd

magic_df <- "{plasma}/{robj_dir}/MAGIC-mtrx.rds" %>%
  glue::glue() %>%
  here::here() %>%
  readRDS(file = .)

# create a new assay to store ADT information
magic_assay <- CreateAssayObject(counts = as.matrix(magic_df))

# Subset merged_se to those barcodes used
merged_se <- merged_se[, colnames(magic_df)]

# add this assay to the previously created Seurat object
merged_se[["MAGIC_Spatial"]] <- magic_assay

Subset to only one sample

se_sub <- subset(merged_se, subset = gem_id == "esvq52_nluss5")
se_sub
## An object of class Seurat 
## 26883 features across 3079 samples within 2 assays 
## Active assay: Spatial (26846 features, 2000 variable features)
##  1 other assay present: MAGIC_Spatial
##  3 dimensional reductions calculated: pca, umap, harmony
se_sub@images <- se_sub@images[Seurat::Images(se_sub) == "esvq52_nluss5"]

A Spatially Resolved Dark- versus Light-Zone Microenvironment Signature Subdivides Germinal Center-Related Aggressive B Cell Lymphomas - Dark Zone: OAZ1, AICDA, H3, MKI67, POLH - Light Zone: LAG3, ITGB8, PDCD1, TIGIT, BCL2, PECAM1, LY6E, B7-H3 (CD276), HLA-DRB1, PSMB10, TNF, ARG1, HLA-E, STAT1

"{plasma}/gene_dict_plasma.R" %>%
  glue::glue() %>%
  here::here() %>%
  source(file = .)
gene_vec <- rownames(magic_df)

Add genes to gene vec

# ig <- c("IGHG1", "IGHG2", "IGHG3", "IGHG4", "IGHA1", "IGHA2", "IGHE", "IGHM")
# pc <- c("XBP1", "CREB3L2", "CD9", "CD44", "PRDM1", "IRF4")
# gene_vec <- unique(c(gene_vec, ig))

# gene_vec <- gene_vec[gene_vec %in% rownames(merged_se)]

Analysis

Add gene signatures for plasma_genes, these signatures are calculated with the lognorm expression.

# merged_se <- Seurat::AddModuleScore(
#   object = merged_se,
#   features = plasma_genes,
#   name = names(plasma_genes))
# sign <- glue::glue("{names(plasma_genes)}{1:length(names(plasma_genes))}")

merged_se <- AddModuleScore_UCell(
    obj = merged_se,
    features = plasma_genes,
    name = '_UCell'
  )

Look at signatures

sign <- colnames(merged_se@meta.data)[stringr::str_detect(string = colnames(merged_se@meta.data), pattern = '_UCell')]

Seurat::SpatialPlot(
  object = merged_se,
  features = sign,
  alpha = c(0, 1),
  images = "esvq52_nluss5",
  ncol = 4)

We also want to compute unbiased signatures from the top marker genes of the cell types of interest

# Read marker genes from plasma-deconvolution.Rmd
markers_lvl5_out <- "{plasma}/{robj_dir}/markers_lvl5_plasma.RDS" %>% 
  glue::glue() %>% 
  here::here()

mgs <- readRDS(markers_lvl5_out)
# Specify cell types of interest
int <- c("Early MBC-derived PC precursors", "LZ-derived early PC precursors",
  "MBC-derived PC precursors")

# Get top 25 genes for each one of these cell types
sign_ls <- lapply(int, function(i) {
  mgs %>%
    # Subset cell type of interest
    dplyr::filter(cluster == i & pct.2 < 0.25) %>%
    # remove ribosomal and mitochondrial genes
    dplyr::filter(stringr::str_detect(string = gene, pattern = "^Rp[l|s]|Mt", negate = TRUE)) %>%
    # Sort genes
    dplyr::arrange(dplyr::desc(avg_log2FC)) %>%
    head(., 25) %>%
    dplyr::pull(gene)
})

names(sign_ls) <- int

Add signatures to object

merged_se <- AddModuleScore_UCell(
    obj = merged_se,
    features = sign_ls,
    name = '_UCell_mgs'
  )

mgs_sign <- colnames(merged_se@meta.data)[stringr::str_detect(string = colnames(merged_se@meta.data), pattern = '_UCell_mgs')]

Look at marker gene derived signatures

Seurat::SpatialPlot(
  object = merged_se,
  features = mgs_sign,
  alpha = c(0, 1),
  images = "esvq52_nluss5",
  ncol = 4)

palette <- colorBlindness::paletteMartin[seq_len(length(unique(merged_se$annotation.general)))]
names(palette) <- unique(merged_se$annotation.general)

Violin plots

Seurat::VlnPlot(
  object = merged_se,
  features = mgs_sign, 
  group.by = "annotation.general",
  pt.size = 0,
  cols = palette)

Restrict the visualization to the follicles

se_follicle <- merged_se[, merged_se$Spatial_snn_res.1.5 %in% c(3, 6, 8)]
library(colorBlindness)
palette <- colorBlindness::paletteMartin[13:15]
names(palette) <- c(3, 6, 8)

(Seurat::VlnPlot(
  object = se_follicle,
  features = c("DZ2", "LZ4"), 
  group.by = "Spatial_snn_res.1.5",
  pt.size = 0,
  cols = palette) |
  Seurat::SpatialPlot(
    object = se_follicle,
    group.by = "Spatial_snn_res.1.5",
    images = "esvq52_nluss5",
    cols = palette)) /
  Seurat::SpatialPlot(
    object = se_follicle,
    features = c("DZ2", "LZ4", "DZ.precPC3"),
    images = "esvq52_nluss5",
    cols = palette)

Marker gene location

Look at the location where the marker genes are expressed along with the cell types

Seurat::DefaultAssay(merged_se) <- "MAGIC_Spatial"

gene_plt <- Seurat::SpatialFeaturePlot(
  object = merged_se,
  features = gene_vec,
  alpha = c(0, 1),
  ncol = 8,
  images = "esvq52_nluss5")

"{plasma}/{plt_dir}/magic_plasma_markers.pdf" %>%
  glue::glue() %>%
  here::here() %>%
  cowplot::save_plot(
    filename = .,
    plot = gene_plt,
    base_height = 35,
    base_width = 25)

Now with the log-norm expression

Seurat::DefaultAssay(merged_se) <- "Spatial"

gene_plt <- Seurat::SpatialFeaturePlot(
  object = merged_se,
  features = gene_vec,
  alpha = c(0, 1),
  ncol = 8,
  images = "esvq52_nluss5")

"{plasma}/{plt_dir}/lognorm_plasma_markers.pdf" %>%
  glue::glue() %>%
  here::here() %>%
  cowplot::save_plot(
    filename = .,
    plot = gene_plt,
    base_height = 35,
    base_width = 25)

Correlation matrix

Since we are working with sample esvq52_nluss5 in this example we will limit the correlation plot to this slide.

(cor_mtrx <- SCrafty::correlation_heatmap( 
  se = se_sub,
  genes = gene_vec[!gene_vec %in% c("IGHV3-20", "IGHV3-43", "CXCR4")],
  assay = "MAGIC_Spatial",
  slot = "data"))

"{plasma}/{plt_dir}/magic_cor-mtrx_markers.pdf" %>%
  glue::glue() %>%
  here::here() %>%
  cowplot::save_plot(
    filename = .,
    plot = cor_mtrx,
    base_height = 15,
    base_width = 15)

  # Correlation with lognorm expression
cor_log <- SCrafty::correlation_heatmap( 
  se = se_sub,
  genes = gene_vec[!gene_vec %in% c("IGHV3-20", "IGHV3-43", "CXCR4")],
  assay = "Spatial",
  slot = "data")

"{plasma}/{plt_dir}/lognorm_cor-mtrx_markers.pdf" %>%
  glue::glue() %>%
  here::here() %>%
  cowplot::save_plot(
    filename = .,
    plot = cor_log,
    base_height = 9,
    base_width = 10)

Look at them side by side

cor_mtrx + cor_log

Integrated correlation matrix

Before we run the gene-correlation matrix on the integrated Seurat object we want to make sure that the behavior across all slides is consistent.

lapply(id_sp_df$gem_id, function(id) {
  print(id)
  tmp_sub <- subset(merged_se, subset = gem_id == id)
  tmp_sub@images <- tmp_sub@images[Seurat::Images(tmp_sub) == id]
  
  (cor_mtrx_genes <- SCrafty::correlation_heatmap( 
    se = tmp_sub,
    genes = gene_vec,
    assay = "MAGIC_Spatial",
    slot = "data") +
     ggplot2::labs(
       title = glue::glue("{id} - gene correlation matrix")))
  
  "{plasma}/{plt_dir}/magic_cor-mtrx_markers_{id}.pdf" %>%
    glue::glue() %>%
    here::here() %>%
    cowplot::save_plot(
      filename = .,
      plot = cor_mtrx_genes,
      base_height = 9,
      base_width = 10)
  
})
## [1] "tarwe1_xott6q"
## [1] "c28w2r_7jne4i"
## [1] "esvq52_nluss5"
## [1] "p7hv1g_tjgmyj"
## [1] "gcyl7c_cec61b"
## [1] "zrt7gl_lhyyar"
## [1] "qvwc8t_2vsr67"
## [1] "exvyh1_66caqq"
## [[1]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_tarwe1_xott6q.pdf"
## 
## [[2]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_c28w2r_7jne4i.pdf"
## 
## [[3]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_esvq52_nluss5.pdf"
## 
## [[4]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_p7hv1g_tjgmyj.pdf"
## 
## [[5]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_gcyl7c_cec61b.pdf"
## 
## [[6]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_zrt7gl_lhyyar.pdf"
## 
## [[7]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_qvwc8t_2vsr67.pdf"
## 
## [[8]]
## [1] "/scratch/devel/melosua/phd/projects/BCLLatlas/tonsil_atlas/spatial_transcriptomics/plasma_integration/2020-09-22/plots_2020-09-22/magic_cor-mtrx_markers_exvyh1_66caqq.pdf"

After checking all the slides seem to be consistent across the gene clusters observed:

(cor_mtrx_int <- SCrafty::correlation_heatmap( 
  se = merged_se,
  genes = gene_vec,
  assay = "MAGIC_Spatial",
  slot = "data") +
   ggplot2::labs(
     title = "Integrated gene correlation matrix"))

"{plasma}/{plt_dir}/magic_cor-mtrx_markers_integrated.pdf" %>%
  glue::glue() %>%
  here::here() %>%
  cowplot::save_plot(
    filename = .,
    plot = cor_mtrx_int,
    base_height = 9,
    base_width = 10)

(cor_mtrx_int <- SCrafty::correlation_heatmap( 
  se = merged_se,
  genes = gene_vec,
  assay = "Spatial",
  slot = "data") +
   ggplot2::labs(
     title = "Integrated gene correlation matrix"))

Trajectory

We are going to look at how the genes change in a manually set path. To do this we use the SPATA2 package, vignette can be found here

We start by subsetting and converting to a SPATA object

# se_sub <- Seurat::RunTSNE(object = se_sub)
sp <- SPATA2::transformSeuratToSpata(
  seurat_object = se_sub,
  sample_name = "esvq52_nluss5",
  image_name = "esvq52_nluss5",
  assay_name = "MAGIC_Spatial",
  assay_slot = "data",
  method = "spatial",
  coords_from = "umap",
  verbose = TRUE)

Draw trajectories

Spatial trajectories of a sample in a given spata-object can be drawn interactively using the function createTrajectories() as shown in the example below. createTrajectories() opens a mini-shiny application. This app allows one the one hand to investigate the sample with regards to spatial gene expression like plotSurfaceInteractive() does and on the other hand to draw trajectories through the areas of interest in four easy steps.

# open interactive application
sp <- SPATA2::createTrajectories(
  object = sp)

# Check that the trajectory has been determined correctly
names(sp@trajectories$esvq52_nluss5)

"{plasma}/{robj_dir}/spata-esvq52_nluss5-plasma.rds" %>%
  glue::glue() %>%
  here::here() %>%
  saveRDS(object = sp, file = .)

Load drawn trajectories

sp <- "{plasma}/{robj_dir}/spata-esvq52_nluss5-plasma.rds" %>%
  glue::glue() %>%
  here::here() %>%
  readRDS(file = .)

Look at the trajectory 1

plotTrajectory(object = sp,
               trajectory_name = "DZ-LZ-PCZ",
               color_by = "annotation.general",
               pt_clrp = "npg",
               pt_alpha = 0.25, # reduce alpha to highlight the trajectory's course
               display_image = FALSE) +
  scale_y_reverse() +
  legendTop()

Look at the trajectory 2

plotTrajectory(object = sp,
               trajectory_name = "DZ-LZ-TZ-PCZ",
               color_by = "annotation.general",
               pt_clrp = "npg",
               pt_alpha = 0.25, # reduce alpha to highlight the trajectory's course
               display_image = FALSE) +
  scale_y_reverse() +
  legendTop()

Look at the trajectory 3

plotTrajectory(object = sp,
               trajectory_name = "HM-DZ-LZ-PCZ2",
               color_by = "annotation.general",
               pt_clrp = "npg",
               pt_alpha = 0.25, # reduce alpha to highlight the trajectory's course
               display_image = FALSE) +
  scale_y_reverse() +
  legendTop()

unbiased assessment of how genes vary over the trajectory

all_genes <- getGenes(sp)

# obtain an assessed trajectory data.frame for all genes
atdf_genes1 <- assessTrajectoryTrends(
  object = sp, 
  trajectory_name = "DZ-LZ-PCZ", 
  variables = all_genes)

"{plasma}/{robj_dir}/gene_trajectory_trend-DZ-LZ-MZ-SE.rds" %>%
  glue::glue() %>%
  here::here() %>%
  saveRDS(object = atdf_genes1, file = .)

Save the list of genes by trajectory trend in an xlsx sheet

library(xlsx)

atdf_genes1 <- "{plasma}/{robj_dir}/gene_trajectory_trend-DZ-LZ-PCZ.rds" %>%
  glue::glue() %>%
  here::here() %>%
  readRDS(file = .)

out_file_gene1 <- "{plasma}/{robj_dir}/gene_trajectory_trend-DZ-LZ-PCZ.xlsx" %>%
  glue::glue() %>%
  here::here()

# Remove file prior to writing it so that there is no overwriting issue
file.remove(out_file_gene1)
lapply(unique(as.character(atdf_genes1$pattern)), function(i) {
  tmp <- atdf_genes1 %>% dplyr::filter(pattern == i & auc < 0.75) %>% data.frame
  print(head(tmp))
  if (nrow(tmp) > 0) {
    xlsx::write.xlsx(
      tmp,
      file = out_file_gene1,
      row.names = FALSE,
      sheetName = i,
      append = file.exists(out_file_gene1))
    }
  })

unbiased assessment of how genes vary over the trajectory

# obtain an assessed trajectory data.frame for all genes
atdf_genes2 <- assessTrajectoryTrends(
  object = sp, 
  trajectory_name = "DZ-LZ-TZ-PCZ", 
  variables = all_genes)

"{plasma}/{robj_dir}/gene_trajectory_trend-DZ-LZ-TZ-PCZ.rds" %>%
  glue::glue() %>%
  here::here() %>%
  saveRDS(object = atdf_genes2, file = .)

Save the list of genes by trajectory trend in an xlsx sheet

library(xlsx)

atdf_genes2 <- "{plasma}/{robj_dir}/gene_trajectory_trend-DZ-LZ-TZ-PCZ.rds" %>%
  glue::glue() %>%
  here::here() %>%
  readRDS(file = .)

out_file_gene2 <- "{plasma}/{robj_dir}/gene_trajectory_trend-DZ-LZ-TZ-PCZ.xlsx" %>%
  glue::glue() %>%
  here::here()

# Remove file prior to writing it so that there is no overwriting issue
file.remove(out_file_gene2)
lapply(unique(as.character(atdf_genes2$pattern)), function(i) {
  tmp <- atdf_genes2 %>% dplyr::filter(pattern == i & auc < 0.75) %>% data.frame
  print(head(tmp))
  if (nrow(tmp) > 0) {
    xlsx::write.xlsx(
      tmp,
      file = out_file_gene2,
      row.names = FALSE,
      sheetName = i,
      append = file.exists(out_file_gene2))
    }
  })

Save the list of gene sets by trajectory trend in an xlsx sheet

library(xlsx)

out_file_gs <- "{plasma}/{robj_dir}/gene-set_trajectory_trend.xlsx" %>%
  glue::glue() %>%
  here::here()

# Remove file prior to writing it so that there is no overwriting issue
file.remove(out_file_gs)
lapply(unique(as.character(atdf_gene_sets$pattern)), function(i) {
  tmp <- atdf_gene_sets %>% dplyr::filter(pattern == i & auc < 0.5) %>% data.frame
  if (nrow(tmp) > 0) {
    xlsx::write.xlsx(
      tmp,
      file = out_file_gs,
      row.names = FALSE,
      sheetName = i,
      append = file.exists(out_file_gs))
    }
  })

Heatmaps

Display trajectory trends with heatmaps DZ-LZ-PCZ

hm_colors <- viridis::inferno(n = 100)
(hm1 <- plotTrajectoryHeatmap(
  object = sp,
  trajectory_name = "DZ-LZ-PCZ",
  variables = gene_vec[!gene_vec %in% c("IGHV3-20", "IGHV3-43")],
  arrange_rows = "maxima",
  # arrange_rows = "minima",
  colors = hm_colors,
  show_rownames = TRUE,
  split_columns = TRUE, 
  smooth_span = 0.5))

"{plasma}/{plt_dir}/magic_trajectory-HM-DZ-LZ-PCZ.pdf" %>%
  glue::glue() %>%
  here::here() %>%
  cowplot::save_plot(
    filename = .,
    plot = hm1,
    base_height = 9,
    base_width = 12)

Display trajectory trends with heatmaps LZ-DZ-IZ-PCZ

(hm2 <- plotTrajectoryHeatmap(
  object = sp,
  trajectory_name = "DZ-LZ-TZ-PCZ",
  variables = gene_vec[!gene_vec %in% c("IGHV3-20", "IGHV3-43")],
  arrange_rows = "maxima",
  colors = hm_colors,
  show_rownames = TRUE,
  split_columns = TRUE, 
  smooth_span = 0.5))

"{plasma}/{plt_dir}/magic_trajectory-HM-LZ-DZ-IZ-PCZ.pdf" %>%
  glue::glue() %>%
  here::here() %>%
  cowplot::save_plot(
    filename = .,
    plot = hm2,
    base_height = 9,
    base_width = 12)

Display trajectory trends with heatmaps DZ-LZ-PCZ2

hm_colors <- viridis::inferno(n = 100)
(hm3 <- plotTrajectoryHeatmap(
  object = sp,
  trajectory_name = "HM-DZ-LZ-PCZ2",
  variables = gene_vec[!gene_vec %in% c("IGHV3-20", "IGHV3-43")],
  arrange_rows = "maxima",
  # arrange_rows = "minima",
  colors = hm_colors,
  show_rownames = TRUE,
  split_columns = TRUE, 
  smooth_span = 0.5))

"{plasma}/{plt_dir}/magic_trajectory-HM-DZ-LZ-PCZ2.pdf" %>%
  glue::glue() %>%
  here::here() %>%
  cowplot::save_plot(
    filename = .,
    plot = hm3,
    base_height = 9,
    base_width = 12)

Session Info

sessionInfo()
## R version 4.0.1 (2020-06-06)
## Platform: x86_64-conda_cos6-linux-gnu (64-bit)
## Running under: Red Hat Enterprise Linux Server release 6.7 (Santiago)
## 
## Matrix products: default
## BLAS/LAPACK: /scratch/groups/hheyn/software/anaconda3/envs/spatial_r/lib/libopenblasp-r0.3.12.so
## 
## locale:
##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C               LC_TIME=es_ES.UTF-8        LC_COLLATE=en_US.UTF-8     LC_MONETARY=es_ES.UTF-8    LC_MESSAGES=en_US.UTF-8    LC_PAPER=es_ES.UTF-8       LC_NAME=C                  LC_ADDRESS=C               LC_TELEPHONE=C             LC_MEASUREMENT=es_ES.UTF-8 LC_IDENTIFICATION=C       
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] stringr_1.4.0      UCell_1.2.0        SPATA2_0.1.0       ggplot2_3.3.5      dplyr_1.0.7        SeuratObject_4.0.4 Seurat_4.0.5      
## 
## loaded via a namespace (and not attached):
##   [1] corrplot_0.92               systemfonts_1.0.3           plyr_1.8.6                  igraph_1.2.10               lazyeval_0.2.2              splines_4.0.1               listenv_0.8.0               scattermore_0.7             GenomeInfoDb_1.26.7         digest_0.6.29               htmltools_0.5.2             viridis_0.6.2               fansi_0.5.0                 magrittr_2.0.1              tensor_1.5                  cluster_2.1.2               ROCR_1.0-11                 tzdb_0.2.0                  globals_0.14.0              readr_2.1.1                 matrixStats_0.61.0          vroom_1.5.7                 spatstat.sparse_2.0-0       prettyunits_1.1.1           colorspace_2.0-2            ggrepel_0.9.1               textshaping_0.3.6           xfun_0.29                   crayon_1.4.2                RCurl_1.98-1.5              jsonlite_1.7.2              spatstat.data_2.1-0         survival_3.2-13             zoo_1.8-9                   glue_1.5.1                  polyclip_1.10-0             gtable_0.3.0                zlibbioc_1.36.0             XVector_0.30.0              leiden_0.3.9                DelayedArray_0.16.3         future.apply_1.8.1         
##  [43] SingleCellExperiment_1.12.0 BiocGenerics_0.36.1         abind_1.4-5                 scales_1.1.1                pheatmap_1.0.12             DBI_1.1.1                   miniUI_0.1.1.1              Rcpp_1.0.7                  progress_1.2.2              viridisLite_0.4.0           xtable_1.8-4                gridGraphics_0.5-1          reticulate_1.22             spatstat.core_2.3-2         bit_4.0.4                   stats4_4.0.1                htmlwidgets_1.5.4           httr_1.4.2                  RColorBrewer_1.1-2          ellipsis_0.3.2              ica_1.0-2                   farver_2.1.0                pkgconfig_2.0.3             sass_0.4.0                  uwot_0.1.11                 deldir_1.0-6                utf8_1.2.2                  here_1.0.1                  ggcorrplot_0.1.3            labeling_0.4.2              tidyselect_1.1.1            rlang_0.4.12                reshape2_1.4.4              later_1.3.0                 munsell_0.5.0               tools_4.0.1                 cli_3.1.0                   generics_0.1.1              ggridges_0.5.3              evaluate_0.14               fastmap_1.1.0               ragg_1.2.1                 
##  [85] yaml_2.2.1                  goftest_1.2-3               bit64_4.0.5                 knitr_1.36                  fitdistrplus_1.1-6          purrr_0.3.4                 RANN_2.6.1                  pbapply_1.5-0               future_1.23.0               nlme_3.1-153                mime_0.12                   SCrafty_0.1.0               compiler_4.0.1              plotly_4.10.0               png_0.1-7                   spatstat.utils_2.3-0        confuns_0.1.0               tibble_3.1.6                bslib_0.3.1                 stringi_1.7.6               highr_0.9                   lattice_0.20-45             Matrix_1.4-0                vctrs_0.3.8                 pillar_1.6.4                lifecycle_1.0.1             spatstat.geom_2.3-1         lmtest_0.9-39               jquerylib_0.1.4             RcppAnnoy_0.0.19            data.table_1.14.2           cowplot_1.1.1               bitops_1.0-7                irlba_2.3.5                 httpuv_1.6.4                patchwork_1.1.1             GenomicRanges_1.42.0        R6_2.5.1                    promises_1.2.0.1            KernSmooth_2.23-20          gridExtra_2.3               IRanges_2.24.1             
## [127] parallelly_1.29.0           codetools_0.2-18            MASS_7.3-54                 assertthat_0.2.1            SummarizedExperiment_1.20.0 rprojroot_2.0.2             withr_2.4.3                 sctransform_0.3.2           S4Vectors_0.28.1            GenomeInfoDbData_1.2.4      mgcv_1.8-38                 parallel_4.0.1              hms_1.1.1                   colorBlindness_0.1.9        grid_4.0.1                  rpart_4.1-15                tidyr_1.1.4                 rmarkdown_2.11              MatrixGenerics_1.2.1        Rtsne_0.15                  lubridate_1.8.0             Biobase_2.50.0              shiny_1.7.1